/**
 * UserAgent
 * 
 * Copyright (c) 2004-2020 UC Mobile Ltd.
 * F/4,Building B,Guangzhou Xinxigang,No.16 Keyun Rd,Guangzhou,China
 * All right reserved.
 * 
 * Created on 2012-10-24
 */
package com.uc.browser.useragent;

/**
 * <b>UserAgent简介:</b>
 * <p>HTTP Head User-Agent对象模型。</p>
 *
 * <b>功能描述:</b>
 * <p>1. 获取浏览器功能数据。</p>
 * <p>2. 获取浏览器设备信息。</p>
 * <p>3. 识别浏览器相关特性，并针对不同浏览器做页面，用户体验适配。</p>
 * 
 * @author raorq
 * @version 1.0
 */
public class UserAgent {
	
    private String userAgent                = "";	

    private String platform 				= "";
	
	private String encryption				= "";

	private String language					= "";
	
	private String os						= "";

	private String osVersion				= "";
	
	private String device					= "";
	
	private String renderingEngine			= "";

	private String renderingEngineVersion	= "";
	
	private String product					= "";
	
	private String productVersion			= "";
	
	private String ucPlatform               = "";
	
	private String ucPlatformVersion        = "";
	
	private String version                  = "";
	
    private boolean isMobileMode 			= false;
  	
	private boolean isUnkown                = false;
	
	private boolean isEmpty                 = false;
	
	/**
	 * <p>获取User-Agent的版本号，例如：新平台为：2.0.0，旧平台为：1.0.0</p>
	 *
	 * @return 版本号
	 */
	public String getVersion() {
	    return version;
	}

	public void setVersion(String version) {
	    this.version = version;
	}

	/**
	 * <p>获取UC浏览器对应的平台，例如：U2，U3</p>
	 *
	 * @return 平台
	 */
	public String getUcPlatform() {
        return ucPlatform;
    }

    public void setUcPlatform(String ucPlatform) {
        this.ucPlatform = ucPlatform;
    }

    /**
     * <p>获取UC浏览器对应平台的版本，例如：0.8.0， 1.0.0</p>
     *
     * @return 平台版本
     */
    public String getUcPlatformVersion() {
        return ucPlatformVersion;
    }

    public void setUcPlatformVersion(String ucPlatformVersion) {
        this.ucPlatformVersion = ucPlatformVersion;
    }

    /**
     * <p>检查当前UserAgent是否为空，即表示HTTP Header 没有User-Agent字段</p>
     *
     * @return UserAgent是否为空
     */
	public boolean isEmpty() {
        return isEmpty;
    }

    public void setEmpty(boolean isEmpty) {
        this.isEmpty = isEmpty;
    }

    /**
	 * <p>获取平台信息，例如：iOS，Linux，Windows,BlackBerry,Java,Symbian,MTK等</p>
	 *
	 * @return 平台信息
	 */
    public String getPlatform() {
        return platform;
    }

    public void setPlatform(String platform) {
        this.platform = platform;
    }

    /**
     * 
     * <p>获取加密信息，例如：U(128位加密)、I(40位加密)、N(没加密)</p>
     *
     * @return 加密信息
     */
    public String getEncryption() {
        return encryption;
    }

    public void setEncryption(String encryption) {
        this.encryption = encryption;
    }
    
    /**
     * 
     * <p>获取语言信息，语言为小写，地区为大写，例如：zh-CN,en-US等</p>
     *
     * @return 语言信息
     */
    public String getLanguage() {
        return language;
    }

    public void setLanguage(String language) {
        this.language = language;
    }

    /**
     * 
     * <p>获取操作系统，例如：S60，Android，iPhone，MIDP2.0，WP，BlackBerry，MTK，Brew等</p>
     *
     * @return 操作系统
     */
    public String getOs() {
        return os;
    }

    public void setOs(String os) {
        this.os = os;
    }

    /**
     * 
     * <p>获取操作系统版本，例如：2.3,4.0,4.2等</p>
     *
     * @return 操作系统版本
     */
    public String getOsVersion() {
        return osVersion;
    }

    public void setOsVersion(String osVersion) {
        this.osVersion = osVersion;
    }

    /**
     * <p>获取设备信息，例如：nokia6300，iPhone4等</p>
     *
     * @return 设备信息
     */
    public String getDevice() {
        return device;
    }

    public void setDevice(String device) {
        this.device = device;
    }

    /**
     * <p>获取渲染引擎，例如：U2，U3，AppleWebKit，Gecko，Trident等</p>
     *
     * @return 渲染引擎
     */
    public String getRenderingEngine() {
        return renderingEngine;
    }

    public void setRenderingEngine(String renderingEngine) {
        this.renderingEngine = renderingEngine;
    }

    /**
     * <p>获取渲染引擎版本号，例如：530.13，20100101等</p>
     *
     * @return 渲染引擎版本号
     */
    public String getRenderingEngineVersion() {
        return renderingEngineVersion;
    }

    public void setRenderingEngineVersion(String renderingEngineVersion) {
        this.renderingEngineVersion = renderingEngineVersion;
    }

    /**
     * <p>获取产品名称，例如：UCBrowser Safari等</p>
     *
     * @return 产品名称
     */
    public String getProduct() {
        return product;
    }

    public void setProduct(String product) {
        this.product = product;
    }

    /**
     * <p>获取产品版本号，例如：8.3.1.202等</p>
     *
     * @return 产品版本号
     */
    public String getProductVersion() {
        return productVersion;
    }

    public void setProductVersion(String productVersion) {
        this.productVersion = productVersion;
    }

    /**
     * <p>当前模式是否适合手持设备浏览模式</p>
     *
     * @return 是否适合手持设备浏览模式
     */
    public boolean isMobileMode() {
        return isMobileMode;
    }

    public void setMobileMode(boolean isMobileMode) {
        this.isMobileMode = isMobileMode;
    }

    /**
     * <p>是否支持html5</p>
     *
     * @return 是否支持html5
     */
    public boolean isSupperHtml5() {
        return renderingEngine != null && (renderingEngine.toLowerCase().indexOf(GlobalConstant.WEBKIT.toLowerCase()) != -1 || renderingEngine.toLowerCase().indexOf("trident") != -1);
    }
    
    /**
     * <p>是否WebKit渲染引擎</p>
     *
     * @return 是否WebKit渲染引擎
     */
    public boolean isWebKit() {
        return renderingEngine != null && (renderingEngine.toLowerCase().indexOf(GlobalConstant.WEBKIT.toLowerCase()) != -1);
    }
 
    /**
     * <p>是否安全模式浏览</p>
     * 
     * @return 是否安全模式浏览
     */
    public boolean isSafe(){
        return encryption != null && 
                (encryption.equals(GlobalConstant.ENCRYPTION_U) || encryption.equals(GlobalConstant.ENCRYPTION_I));
    }

    /**
     * <p>是否是U2内核</p>
     *
     * @return 是否是U2内核
     */
    public boolean isU2() {
        return ucPlatform != null && ucPlatform.equals(GlobalConstant.U2);
    }
    
    /**
     * <p>是否是U3内核</p>
     * 
     * @return 是否是U3内核
     */
    public boolean isU3() {
        return ucPlatform != null && ucPlatform.equals(GlobalConstant.U3);
    }
   
    /**
     * <p>是否是Symbian S60系统</p>
     *
     * @return 是否是Symbian S60系统
     */
    public boolean isS60(){
        return (os != null && (os.toLowerCase().indexOf("s60") != -1)) || ((platform != null && (platform.toLowerCase().indexOf("s60") != -1)));
    }
    
    /**
     * <p>是否是Symbian S60 V1系统</p>
     *
     * @return 是否是Symbian S60 V1系统
     */
    public boolean isS60V1(){
        return isS60() && ((osVersion != null && (osVersion.toLowerCase().indexOf("v1") != -1)) || 
        		((platform != null && (platform.toLowerCase().indexOf("v1") != -1))));
    }

    /**
     * <p>是否是Symbian S60 V2系统</p>
     *
     * @return 是否是Symbian S60 V2系统
     */
    public boolean isS60V2(){
        return  isS60() && ((osVersion != null && (osVersion.toLowerCase().indexOf("v2") != -1)) ||
        		((platform != null && (platform.toLowerCase().indexOf("v2") != -1))));
    }
    
    /**
     * <p>是否是Symbian S60 V3系统</p>
     *
     * @return 是否是Symbian S60 V3系统
     */
    public boolean isS60V3(){
        return  isS60() && ((osVersion != null && (osVersion.toLowerCase().indexOf("v3") != -1)) ||
        		((platform != null && (platform.toLowerCase().indexOf("v3") != -1))));
    }

    /**
     * <p>是否是Symbian S60 V5系统</p>
     *
     * @return 是否是Symbian S60 V5系统
     */
    public boolean isS60V5(){
        return  isS60() && ((osVersion != null && (osVersion.toLowerCase().indexOf("v5") != -1)) ||
        		((platform != null && (platform.toLowerCase().indexOf("v5") != -1))));
    }
    
    /**
     * <p>是否是Symbian3系统</p>
     *
     * @return 是否是Symbian3系统
     */
    public boolean isSymbian3(){
        return ((os != null && (os.indexOf("Symbian3") != -1)) || (platform != null && (platform.indexOf("Symbian3") != -1))) ;
    }
    
    /**
     * <p>是否是iPhone</p>
     *
     * @return 是否是iPhone
     */
    public boolean isiPhone(){
        return device != null && (device.toLowerCase().indexOf("iphone") != -1 || device.toLowerCase().indexOf("iph") != -1)
                || os != null && (os.toLowerCase().indexOf("iphone") != -1 || os.toLowerCase().indexOf("iph") != -1);
    }
   
    /**
     * <p>是否是iPhone1</p>
     *
     * @return 是否是iPhone1
     */
    public boolean isiPhone1(){
        return device != null && (device.toLowerCase().indexOf("iphone1") != -1 || device.toLowerCase().indexOf("iph1") != -1) ;
    } 
    
    /**
     * <p>是否是iPhone2</p>
     *
     * @return 是否是iPhone2
     */
    public boolean isiPhone2(){
        return device != null && (device.toLowerCase().indexOf("iphone2") != -1 || device.toLowerCase().indexOf("iph2") != -1) ;
    } 
    
    /**
     * <p>是否是iPhone3</p>
     *
     * @return 是否是iPhone3
     */
    public boolean isiPhone3(){
        return device != null && (device.toLowerCase().indexOf("iphone3") != -1 || device.toLowerCase().indexOf("iph3") != -1) ;
    } 
    
    /**
     * <p>是否是iPhone4</p>
     *
     * @return 是否是iPhone4
     */
    public boolean isiPhone4(){
        return device != null && (device.toLowerCase().indexOf("iphone4") != -1 || device.toLowerCase().indexOf("iph4") != -1) ;
    } 
    
    /**
     * <p>是否是iPhone5</p>
     *
     * @return 是否是iPhone5
     */
    public boolean isiPhone5(){
        return device != null && (device.toLowerCase().indexOf("iphone5") != -1 || device.toLowerCase().indexOf("iph5") != -1) ;
    } 
    
    /**
     * <p>是否是iPad</p>
     *
     * @return 是否是iPad
     */
    public boolean isiPad(){
        return device != null && (device.indexOf("ipad") != -1) ;
    } 
    
    /**
     * <p>是否是Windows Phone</p>
     *
     * @return 是否是Windows Phone
     */
    public boolean isWP(){
        return os != null && ((os.toLowerCase().indexOf("wp") != -1) || os.toLowerCase().indexOf("windows phone") != -1) ;
    } 
    
    /**
     * <p>是否是Android设备</p>
     * 
     * @return 是否是Android设备
     */
    public boolean isAndroid(){
        return os != null &&
                (os.toLowerCase().indexOf("android") != -1 || os.toLowerCase().indexOf("adr") != -1);
    } 
    
    /**
     * <p>是否是iPhone</p>
     *
     * @return 是否是iPhone
     */
    public boolean isApad(){
        return false;
    } 
    
    /**
     * <p>是否是WinPad</p>
     *
     * @return 是否是WinPad
     */
    public boolean isWinPad(){
        return false;
    }
	
    /**
     * <p>是否是智能设备</p>
     *
     * @return 是否是智能设备
     */
    public boolean isSmartPhone(){
        return !(isJava() || isMTK() || isBrew());
    }
    
    /**
     * <p>是否是Brew设备</p>
     *
     * @return 是否是Brew设备
     */
    public boolean isBrew(){
        return platform != null && platform.toLowerCase().indexOf("brew") != -1;
    }
    
    /**
     * <p>是否是Java平台</p>
     *
     * @return 是否是Java平台
     */
    public boolean isJava(){
        return platform != null && platform.toLowerCase().indexOf(GlobalConstant.JAVA.toLowerCase()) != -1;
    }
    
    /**
     * <p>是否是MTK设备</p>
     *
     * @return 是否是MTK设备
     */
    public boolean isMTK(){
        return platform != null && platform.toLowerCase().indexOf("mtk") != -1;
    }
    
    /**
     * <p>是否是Linux平台</p>
     *
     * @return 是否是Linux平台
     */
    public boolean isLinux(){
        return platform != null &&  platform.toLowerCase().indexOf("linux") != -1;
    }
    
    /**
     * <p>是否是Windows平台</p>
     *
     * @return 是否是Windows平台
     */
    public boolean isWindows(){
        return platform != null &&  platform.toLowerCase().indexOf("windows") != -1;
    }
    
    /**
     * <p>是否是Symbian平台</p>
     *
     * @return 是否是Symbian平台
     */
    public boolean isSymbian(){
        return isS60() || platform != null &&  platform.toLowerCase().indexOf("symbian") != -1;
    }
    
    /**
     * <p>是否是iOS平台</p>
     *
     * @return 是否是iOS平台
     */
    public boolean isiOS(){
        return platform != null &&  platform.toLowerCase().indexOf("ios") != -1;
    }

    /**
     * <p>检查当前UserAgent是否未知，一般情况为无法识别</p>
     *
     * @return UserAgent是否未知
     */
    public boolean isUnkown() {
        return isUnkown;
    }

    public void setUnkown(boolean isUnkown) {
        this.isUnkown = isUnkown;
    }

    /**
     * <p>检查当前UserAgent是否旧UA格式</p>
     *
     * @return UserAgent是否旧UA格式
     */
    public boolean isOldVersion() {
        return version != null && version.indexOf(GlobalConstant.VERSION_1) != -1;
    }
    
    /**
     * <p>检查当前UserAgent是否新UA格式</p>
     *
     * @return UserAgent是否新UA格式
     */
    public boolean isNewVersion() {
        return !isOldVersion();
    }
    
    /**
     * <p>获取原始的HTTP Header字段</p>
     *
     * @return 原始的HTTP Header字段
     */
    public String getUserAgent() {
        return userAgent;
    }

    public void setUserAgent(String userAgent) {
        this.userAgent = userAgent;
    }
    
    public String toString(){
        StringBuilder sb = new StringBuilder();
        sb.append("Platform:                        ").append(platform).append("\r\n");
        sb.append("Encryption:                      ").append(encryption).append("\r\n");
        sb.append("Language:                        ").append(language).append("\r\n");
        sb.append("OS:                              ").append(os).append("\r\n");
        sb.append("OS Version                       ").append(osVersion).append("\r\n");
        sb.append("Device:                          ").append(device).append("\r\n");
        sb.append("Rendering Engine:                ").append(renderingEngine).append("\r\n");
        sb.append("Rendering Engine Version:        ").append(renderingEngineVersion).append("\r\n");
        sb.append("Product:                         ").append(product).append("\r\n");
        sb.append("Product Version:                 ").append(productVersion).append("\r\n");
        sb.append("UC Platform:                     ").append(ucPlatform).append("\r\n");
        sb.append("UC Platform Version:             ").append(ucPlatformVersion).append("\r\n");
        sb.append("isUnkown:                        ").append(isUnkown()).append("\r\n");     
        sb.append("isSupperHtml5:                   ").append(isSupperHtml5()).append("\r\n");   
        sb.append("isSafe:                          ").append(isSafe()).append("\r\n");   
        sb.append("isU2:                            ").append(isU2()).append("\r\n");   
        sb.append("isU3:                            ").append(isU3()).append("\r\n");   
        sb.append("isMobileMode:                    ").append(isMobileMode()).append("\r\n");   
        sb.append("isS60:                           ").append(isS60()).append("\r\n");   
        sb.append("isS60V1:                         ").append(isS60V1()).append("\r\n");   
        sb.append("isS60V2:                         ").append(isS60V2()).append("\r\n");   
        sb.append("isS60V3:                         ").append(isS60V3()).append("\r\n");   
        sb.append("isS60V5:                         ").append(isS60V5()).append("\r\n");   
        sb.append("isSymbian3:                      ").append(isSymbian3()).append("\r\n");   
        sb.append("isiPhone:                        ").append(isiPhone()).append("\r\n");   
        sb.append("isiPhone1:                       ").append(isiPhone1()).append("\r\n");   
        sb.append("isiPhone2:                       ").append(isiPhone2()).append("\r\n");   
        sb.append("isiPhone3:                       ").append(isiPhone3()).append("\r\n");   
        sb.append("isiPhone4:                       ").append(isiPhone4()).append("\r\n");   
        sb.append("isiPhone5:                       ").append(isiPhone5()).append("\r\n");   
        sb.append("isiPad:                          ").append(isiPad()).append("\r\n");   
        sb.append("isWP:                            ").append(isWP()).append("\r\n");   
        sb.append("isAndroid:                       ").append(isAndroid()).append("\r\n");   
        sb.append("isApad:                          ").append(isApad()).append("\r\n");   
        sb.append("isWinPad:                        ").append(isWinPad()).append("\r\n");   
        sb.append("isSmartPhone:                    ").append(isSmartPhone()).append("\r\n");   
        sb.append("isBrew:                          ").append(isBrew()).append("\r\n");   
        sb.append("isJava:                          ").append(isJava()).append("\r\n");   
        sb.append("isMTK:                           ").append(isMTK()).append("\r\n");   
        sb.append("isLinux:                         ").append(isLinux()).append("\r\n");   
        sb.append("isWindows:                       ").append(isWindows()).append("\r\n");   
        sb.append("isiOS:                           ").append(isiOS()).append("\r\n");   
        sb.append("isEmpty:                         ").append(isEmpty()).append("\r\n");   
        sb.append("isSymbian:                       ").append(isSymbian()).append("\r\n");    
        
        return sb.toString();
    }
    
}
